#!/usr/bin/python
# -*- coding: utf-8 -*-

# Apache hosts control
#
# Author: GoTLiuM InSPiRiT <gotlium@gmail.com>
#
# Copyright 2010, GoTLiuM InSPiRiT <gotlium@gmail.com>.
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2, as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranties of
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
# PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see <http://www.gnu.org/licenses/>.

from functions import *;

# Шаблон
template = """NameVirtualHost *:{port}
<VirtualHost *:{port}>
  {ssl}
  DocumentRoot {droot}
  ServerName {sname}
  ServerAlias www.{sname}
  ServerAdmin webmaster@{sname}
</VirtualHost>
""";

#############################################################################

# Формируем имя хоста
host_name = sys.argv[2].strip() + PREFIX;

# Директории проекта
fdirectory = DIRECTORY + host_name;
sdirectory = "%s/www" % fdirectory;

#############################################################################

# Если всё в порядке
if sys.argv[1] == 'add':
  
  # Активируем модуль php.
  os.system('%s php5 >& /dev/null' % A2ENMOD);
  
  # Проверим наличие директорий проекта
  if os.path.exists(fdirectory) or os.path.exists(sdirectory):
    print message('Каталог проекта уже существует!', 'red');
    sys.exit(1);

  # Создаём директории проекта.
  try:
    os.mkdir(fdirectory);
    os.mkdir(sdirectory);
  except:
    print message('Не удалось создать каталоги!', 'red');
    sys.exit(1);

  # Присваиваем права созданным директориям.
  try:
    os.chmod( fdirectory, 0755 );
    os.chmod( sdirectory, 0755 );
  except:
    print message('Не удалось установить права на каталоги!', 'red');
    sys.exit(1);

  # Меняем владельца. Для того что бы можно было 
  # записывать и изменять, что-либо в папке.
  try:
    os.chown( fdirectory, USERUID, USERUID );
    os.chown( sdirectory, USERUID, USERUID );
  except:
    print message('Не удалось сменить владельца для папок!', 'red');
    sys.exit(1);

  # содержание обычного http хоста
  hhost = template.replace('{sname}', host_name).replace('{droot}', sdirectory).replace('{port}', '80').replace('{ssl}', '');

  # содержание ssl хоста
  shost = template.replace('{sname}', host_name).replace('{droot}', sdirectory).replace('{port}', '443').replace('{ssl}', SSL_STRING);

  # Сохраняем обычный хост в директорию доступных проектов апача
  hfile = '%s/%s' % (SITE_AV, host_name);
  if not writefile(hfile, 'w', hhost):
    print message('Не удалось сохранить файл http хоста apache!', 'red');
    sys.exit(1);

  # Сохраняем ssl хост в директорию доступных проектов апача
  sfile = '%s.ssl' % hfile;
  if not writefile(sfile, 'w', shost):
    print message('Не удалось сохранить файл ssl хоста apache!', 'red');
    sys.exit(1);

  # Активируем созданные хосты
  site_active(host_name, True);

  # Создаём индексный файл
  index_file = '%s/index.html' % sdirectory;
  if not writefile(index_file, 'w', 'Hello Word!'):
    print message('Не удалось создать индексный файл!', 'red');
    sys.exit(1);
  else:
    try:
      os.chmod(index_file, 0644);
      os.chown(index_file, USERUID, USERUID);
    except:
      print message('Не удалось задать права индексному файлу!', 'red');
      sys.exit(1);

  # Закончили, и вывели сообщения
  print message('Сайт успешно добавлен!', 'lightgreen');
  print message('Для проверки http наберите\nlinks http://%s/' % host_name, 'green');
  print message('Для проверки ssl наберите\nlinks https://%s/' % host_name, 'green');
  
  # Закончили выполнение сценария
  sys.exit(0);
  
elif sys.argv[1] == 'del':
  
  # Проверим наличие директорий
  if not os.path.exists(fdirectory):
    print message('Каталог проекта не существует!', 'red');
    sys.exit(1);

  site_active(host_name, False);

  # Удаляем хосты из доступных апачу
  hfile = '%s/%s' % (SITE_AV, host_name);
  os.system('rm -r %s' % hfile);
  os.system('rm -r %s.ssl' % hfile);

  # Спрашиваем пользователя, в плане удаления каталога проекта
  msg = raw_input("Удалить папку проекта?!(Да/Нет)");
  msg = string.lower(str(msg));
  if msg not in ('н','нет','n', 'no'):
    os.system("rm -r %s" % fdirectory);
    
  # Закончили и вывели сообщение пользователю
  print message('Сайт <%s> успешно удален!'%host_name, 'lightgreen');
